// Copyright (C) Kumo inc. and its affiliates.
// Author: Jeff.li lijippy@163.com
// All rights reserved.
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published
// by the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program.  If not, see <https://www.gnu.org/licenses/>.
//

#pragma once

#include <ksimd/ksimd.hpp>

#ifdef __BMI2__
#define NEBULA_HAVE_BMI2 1
#define NEBULA_HAVE_RUNTIME_BMI2 1
#endif

#ifdef __AVX2__
#define NEBULA_HAVE_AVX2 1
#define NEBULA_HAVE_RUNTIME_AVX2_SUPPORTED 1
#endif

#ifdef __SSE4_2__
#define NEBULA_HAVE_SSE4_2 1
#endif

#ifdef _MSC_VER
// MSVC x86_64/arm64

#if defined(_M_AMD64) || defined(_M_X64)
#include <intrin.h>
#endif

#else
// gcc/clang (possibly others)


#if defined(NEBULA_HAVE_BMI2)
#include <x86intrin.h>
#endif

#if defined(NEBULA_HAVE_AVX2) || defined(NEBULA_HAVE_AVX512)
#include <immintrin.h>
#elif defined(NEBULA_HAVE_SSE4_2)
#include <nmmintrin.h>
#endif

#ifdef NEBULA_HAVE_NEON
#include <arm_neon.h>
#endif

#endif
